#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QCamera>
#include <QCameraViewfinder>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QCameraInfo>
#include <QVideoProbe>
#include <QPropertyAnimation>
#include <cmath>
#include <QKeyEvent>
#include <QGraphicsObject>
#include <QLabel>
#include <QVBoxLayout>
#include <QMessageBox>
#include <QTextEdit>
#include <QFile>
#include <QDir>
#include <QDateTime>
#include <QMutex>
#include <QTextStream>
#include <QGraphicsView>
#include <QGridLayout>
#include <QScrollBar>
#include <QTextEdit>
#include <QCloseEvent>
#include <QMessageBox>
#include <opencv2/opencv.hpp>
#include <QImage>
#include <QPixmap>
#include <QTimer>
#include <QElapsedTimer>
#include <QTcpSocket>
#include <QImage>
#include "graphicsrectitem.h"
#include "steeringwheel.h"
#include "gearcontrol.h"
#include "robotarrawkey.h"
#include "runcmd.h"
#include "buttonmanager.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

// protected:
//     void closeEvent(QCloseEvent *event);

signals:
    void emitCmdStr(QString);
    void startConnection(const QString &host, quint16 port);  // 启动连接的信号
private slots:
    void updateCameraFrame(const QVideoFrame &frame);
    void rotateView(int direction);
    void onRotationChanged(qreal angle);
    void onGearCommand(int command);  // 操纵杆命令槽函数
    // 命令执行反馈槽函数
    void handleOutput(const QString& output);
    void handleError(const QString& error);
    void handleFinished(int exitCode, runcmd* sender);
    void handleButtonClick(int button); // 处理按钮点击的槽函数
    //更新深度摄像头视频流和点云流
    void onSocketConnected();
    void onSocketDisconnected();
    void onSocketReadyRead();
    void onSocketError(QAbstractSocket::SocketError error);


private:
    enum KeyValue{up,down,left,right,park,stop,leftup,rightup,leftdown,rightdown,none}; //park能左右转，stop是完全静止
    enum ButtonValue{agent,slam,map,nav,follow,closeslam,closenav,resetros2,buttonnone};
    Ui::MainWindow *ui;
    QCamera *camera;
    QVideoWidget *videoWidget;  // 使用 QVideoWidget
    QGraphicsScene *indicatorScene;
    GraphicsRectItem *viewIndicator;  // 使用自定义类
    QGraphicsView *steeringView;
    QGraphicsScene *scene;
    SteeringWheel *steeringWheel;
    GearControl *m_gearControl;
    QLabel *m_angleLabel;  // 角度显示标签
    QLabel *m_commandLabel;  // 命令显示标签
    RobotArrawKey *rarrkey;

    QTextEdit *textOutput;
    ButtonManager *buttonManager;
    void ProcessCmd(QString str);
    void setupSteeringWheel();
     // QGraphicsRectItem *viewIndicator;
    int currentRotation = 0;
    void initCamera();
    void initViewIndicator();
    void robotcontrol();
    int getlinerarraw();
    void setlinerarraw(KeyValue value);
    int getanglearraw();
    void setanglearraw(KeyValue value);
    KeyValue currentanglearraw = none;
    KeyValue currentlinerarraw = none;
    void saveLogToFile(const QString &error);  // 保存日志
    bool slam_hook;
    bool agent_hook;
    QMutex logMutex;  // 用于线程安全
    QTcpSocket *socket;         // Socket 直接在主线程操作
    QLabel *colorVideoLabel;    // 显示视频的 QLabel
    QByteArray buffer;          // 接收数据缓冲区
    quint64 frameSize = 0;      // 当前帧大小
    QElapsedTimer frameTimer;   // 用于控制帧率
    bool isFirstFrame = true;   // 标记是否为第一帧

    void updateFrame(const QImage &frame);

    QList<runcmd*> m_executors;  // 执行器对象池，执行多个外部命令
    void gracefulStopAllProcesses();
    void forceStopAllProcesses();

};

#endif // MAINWINDOW_H
